/*
 * Copyright (c) 2021 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
/**
  ******************************************************************************
  * @file    main.c
  * @author  GEEKROS,  site:www.geekros.com
  ******************************************************************************
*/

#include "main.h"

#define BAUD_115200  115200

#define STACK_SIZE_4K  4096
#define STACK_SIZE_5K  5120

#define PRIOR_3  3
#define PRIOR_4  4
#define PRIOR_5  5

/*******************************************************************
  * @ 函数名  ： main
  * @ 功能说明： 程序启动入口，主要初始化一些开发板的模块以及任务
  * @ 参数    ： 无
  * @ 返回值  ： 无
  *************************************************************/
int main(void)
{
    // 定义任务创建的返回值，默认为成功
    UINT32 LiteOS_Status = LOS_OK;

    // LiteOS内核初始化
    LiteOS_Status = LOS_KernelInit();
    if (LiteOS_Status != LOS_OK) {
        // LiteOS内核初初始化
        return LOS_NOK;
    } else {
        // 时钟初始化
        Delay_Init(LOSCFG_BASE_CORE_TICK_PER_SECOND);

        // USB虚拟串口初始化
        Usb_Init();

        // CPU模块初始化
        Cpu_Init();

        // LED模块初始化
        Led_Init();

        // BUZZER模块初始化
        Buzzer_Init();

        // CAN模块初始化
        Can_Init();

        // POWER模块初始化
        Power_Init();

        // KEY模块初始化
        Key_Init();

        // ADC模块初始化
        Adc_Init();

        // PWM模块初始化
        Pwm_Init();

        // MPU模块初始化
        Mpu_Init();

        // wifi模块初始化
        Wifi_Init(BAUD_115200);

        if (ESP8266_start_TCP() == -1) {
            GREEN_LED_OFF();
        } else {
            GREEN_LED_ON();
        }

        // 任务初始化
        LiteOS_Status = Task_Init();
        // 开启LiteOS任务调度
        LOS_Start();
    }
    while(1) {
        ;
    }
}

/*******************************************************************
  * @ 函数名  ： Task_Init
  * @ 功能说明： 任务初始化，为了方便管理，所有的任务创建函数都可以放在这个函数里面
  * @ 参数    ： 无
  * @ 返回值  ： 无
  *************************************************************/
static UINT32 Task_Init(void)
{
    // 定义任务创建的返回值，默认为成功
    UINT32 Status = LOS_OK;

    Status = Start_System_Task();
    if (Status != LOS_OK) {
        // 任务启动失败
        return LOS_NOK;
    }

    Status = Start_Serial_Task();
    if (Status != LOS_OK) {
        // 任务启动失败
        return LOS_NOK;
    }

    Status = Start_User_Task();
    if (Status != LOS_OK) {
        // 任务启动失败
        return LOS_NOK;
    }

    if(Status == LOS_OK) {
        RED_LED_ON(); 
        Usb_Write_Data("ALL OK\r\n");
    }

    return Status;
}

/*******************************************************************
  * @ 函数名  ： Start_System_Task
  * @ 功能说明： 启动系统任务
  * @ 参数    ： 无
  * @ 返回值  ： 无
  *************************************************************/
UINT32 System_Task_Handle;
static UINT32 Start_System_Task(void)
{
    // 定义任务创建的返回值，默认为成功
    UINT32 Task_Status = LOS_OK;

    TSK_INIT_PARAM_S task_init_param;

    // 任务优先级，数值越小，优先级越高
    task_init_param.usTaskPrio = PRIOR_3;

    // 任务名称
    task_init_param.pcName = "System_Task";

    // 任务函数入口
    task_init_param.pfnTaskEntry = (TSK_ENTRY_FUNC)System_Task;

    // 任务堆栈大小
    task_init_param.uwStackSize = STACK_SIZE_4K;

    // 创建任务
    Task_Status = LOS_TaskCreate(&System_Task_Handle, &task_init_param);

    return Task_Status;
}

/*******************************************************************
  * @ 函数名  ： Start_Serial_Task
  * @ 功能说明： 启动串口任务
  * @ 参数    ： 无
  * @ 返回值  ： 无
  *************************************************************/
UINT32 Serial_Task_Handle;
static UINT32 Start_Serial_Task(void)
{
    // 定义任务创建的返回值，默认为成功
    UINT32 Task_Status = LOS_OK;

    TSK_INIT_PARAM_S task_init_param;

    // 任务优先级，数值越小，优先级越高
    task_init_param.usTaskPrio = PRIOR_4;

    // 任务名称
    task_init_param.pcName = "Serial_Task";

    // 任务函数入口
    task_init_param.pfnTaskEntry = (TSK_ENTRY_FUNC)Serial_Task;

    // 任务堆栈大小
    task_init_param.uwStackSize = STACK_SIZE_5K;
    // 创建任务
    Task_Status = LOS_TaskCreate(&Serial_Task_Handle, &task_init_param);

    return Task_Status;
}

/*******************************************************************
  * @ 函数名  ： Start_User_Task
  * @ 功能说明： 启动用户任务
  * @ 参数    ： 无
  * @ 返回值  ： 无
  *************************************************************/
UINT32 User_Task_Handle;
static UINT32 Start_User_Task(void)
{

    // 定义任务创建的返回值，默认为成功
    UINT32 Task_Status = LOS_OK;

    TSK_INIT_PARAM_S task_init_param;

    // 任务优先级，数值越小，优先级越高
    task_init_param.usTaskPrio = PRIOR_5;

    // 任务名称
    task_init_param.pcName = "User_Task";

    // 任务函数入口
    task_init_param.pfnTaskEntry = (TSK_ENTRY_FUNC)User_Task;

    // 任务堆栈大小
    task_init_param.uwStackSize = STACK_SIZE_4K;

    // 创建任务
    Task_Status = LOS_TaskCreate(&User_Task_Handle, &task_init_param);

    return Task_Status;
}
